import "reflect-metadata"
import { DataSource } from "typeorm"
import { User } from "./entity/User"
import { Aaa } from "./entity/Aaa"

//数据库配置

export const AppDataSource = new DataSource({
    type: "mysql",
    host: "localhost",
    port: 3306,
    username: "root",
    password: "zjhQQsybzd",
    database: "typeorm",
    synchronize: true,  //根据Entity自动建表
    logging: false,     //打印sql
    entities: [User,Aaa],  //数据库表对应的Entity 或者可以填 ['./**/entity/*.ts']
    migrations: [],    //修改表结构
    subscribers: [],   //Entity生命周期订阅者, 比如在insert、update、remove 前后加入一些逻辑。
    poolSize: 10,      //数据库连接池中连接的最大数量。
    connectorPackage: 'mysql2',  //驱动包
    extra: {
        authPlugin: 'sha256_password', //驱动包额外配置
    }
})


/* 
Data-Source  管理着数据库连接配置，数据库驱动包，调用它的 intialize 方法会创建和 mysql 的连接。

Entity  通过 @Entity 指定和数据库表的映射，通过 @PrimaryGeneratedColumn 和 @Column 指定和表的字段的映射。

Entity 做增删改查通过 EntityManager 的 save、delete、find、createQueryBuilder 等方法。

如果只是对单个 Entity 做 CRUD，那可以先 getRepository 拿到对具体 Entity 操作的工具类，再调用 save、delete、find 等方法。


具体的 EntityManager 和 Repository 的方法有这些：
save：  新增或者修改 Entity，如果传入了 id 会先 select 再决定修改还新增
update：直接修改 Entity，不会先 select
insert：直接插入 Entity
delete：删除 Entity，通过 id
remove：删除 Entity，通过对象
find：查找多条记录，可以指定 where、order by 等条件
findBy：查找多条记录，第二个参数直接指定 where 条件，更简便一点
findAndCount：查找多条记录，并返回总数量
findByAndCount：根据条件查找多条记录，并返回总数量
findOne：查找单条记录，可以指定 where、order by 等条件
findOneBy：查找单条记录，第二个参数直接指定 where 条件，更简便一点
findOneOrFail：查找失败会抛 EntityNotFoundError 的异常
query：直接执行 sql 语句
createQueryBuilder：创建复杂 sql 语句，比如 join 多个 Entity 的查询
transaction：包裹一层事务的 sql
getRepository：拿到对单个 Entity 操作的类，方法同 EntityManager

*/